package cc.magicjson.spring.exploration.annotation.role.aop.config;

import cc.magicjson.spring.exploration.annotation.role.aop.advisor.InfrastructureAdvice;
import cc.magicjson.spring.exploration.annotation.role.aop.advisor.RegularAdvice;
import org.springframework.aop.Advisor;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.aop.support.JdkRegexpMethodPointcut;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Role;

import static cc.magicjson.spring.exploration.annotation.role.aop.constants.PointcutPattern.CUSTOM_AOP_POINTCUT_PATTERN;
import static org.springframework.beans.factory.config.BeanDefinition.ROLE_INFRASTRUCTURE;

/**
 * 配置类，用于定义Advisor和切入点
 * InfrastructureAdvice与RegularAdvice 控制变量测试
 * InfrastructureAdvice实验组 RegularAdvice对照组
 * 实验@Role(ROLE_INFRASTRUCTURE)在AOP的作用
 *
 * @author <a href="mailto:it_magicjson@163.com">MagicJson</a>
 */
@Configuration
public class AdvisorConfig {
    @Bean
    // 标记这个Bean为基础设施角色 用在框架内部支持 当前使用的是编程式
    @Role(ROLE_INFRASTRUCTURE)
    public Advisor infrastructureAdvisor(InfrastructureAdvice infrastructureAdvice) {
        // 创建一个基于正则表达式的切入点
        JdkRegexpMethodPointcut pointcut = new JdkRegexpMethodPointcut();
        // 设置切入点匹配的类路径模式
        pointcut.setPattern(CUSTOM_AOP_POINTCUT_PATTERN);
        // 创建并返回一个Advisor，将切入点和通知组合在一起
        return new DefaultPointcutAdvisor(pointcut, infrastructureAdvice);
    }

    @Bean
    public Advisor regularAdvisor(RegularAdvice regularAdvice) {
        // 创建一个基于正则表达式的切入点
        JdkRegexpMethodPointcut pointcut = new JdkRegexpMethodPointcut();
        // 设置切入点匹配的类路径模式
        pointcut.setPattern(CUSTOM_AOP_POINTCUT_PATTERN);
        // 创建并返回一个Advisor，将切入点和通知组合在一起
        return new DefaultPointcutAdvisor(pointcut, regularAdvice);
    }
}
